#include <stdio.h>
#include <stdlib.h>
#include "arbre.h"
#include "element.h"

/*void initialiserNoeud(Noeud **pN, Elem e, Noeud *fg, Noeud *fd){
	
	*pN=(Noeud*)malloc(sizeof(Noeud));
	pN->fg=fg->fg;
	pN->fd=fd->fd;
	pN->info=e;
}*/
void initialiserNoeud(Noeud *pN, Elem e){
	  pN->info = e;
	  pN->fg = NULL;
	  pN->fd = NULL;
}

void initialiserArbre(Arbre * pA){
	
	pA->adRacine=NULL;
	pA->nbElemDansArbre=0;
}

void testamentArbre(Arbre *pA){
	if(pA->adRacine != NULL){
		detruireAPartirDe(pA->adRacine,pA);
		pA->nbElemDansArbre=0;
		pA->adRacine=NULL;
	}
}
/**renseigner champs pour les elements a inserer	*/
/*void renseignerChampsElem(Elem * e, int x, int y, int t)
{
	  e->x = x;
	  e->y = y;
	  e->type_de_forme = t;
}*/

void detruireAPartirDe(Noeud *pN, Arbre *pA){
	if(pN != NULL){
		detruireAPartirDe(pN->fg,pA);
		detruireAPartirDe(pN->fd,pA);
		free(pN);
  }
}

int testArbreVide(Arbre A){
	if(A.adRacine==NULL)
		return 1;
	else
		return 0;
}


void affichageInfixeArbre(Arbre A){
	printf("nombre d'element dans l'arbre (infixe) %d\n",A.nbElemDansArbre);
	affichageNoeudInfixe(A.adRacine);
}

void affichageNoeudInfixe(Noeud *pN){
	if(pN != NULL){
		affichageNoeudInfixe(pN->fg);
		afficherElem(pN->info);
		/*printf("\n");*/
		affichageNoeudInfixe(pN->fd);		
    }
}


void affichagePrefixeArbre(Arbre A){
	printf("nombre d'element dans l'arbre (prefixe) %d \n",A.nbElemDansArbre);
	affichageNoeudPrefixe(A.adRacine);
}

void affichageNoeudPrefixe(Noeud *pN){
	if(pN != NULL){
		afficherElem(pN->info);
		/*printf("\n");*/
		affichageNoeudPrefixe(pN->fg);		
		affichageNoeudPrefixe(pN->fd);		
    }
}

void affichagePostfixeArbre(Arbre A){
	printf("nombre d'element dans l'arbre (postfix) %d \n",A.nbElemDansArbre);
	affichageNoeudPostfixe(A.adRacine);
}

void affichageNoeudPostfixe(Noeud *pN){
	if(pN != NULL){
		affichageNoeudPostfixe(pN->fg);		
		affichageNoeudPostfixe(pN->fd);
		afficherElem(pN->info);	
    }
}
/*
void affichageNoeud(Noeud *pN){
	if(pN != NULL)
    {
      affichageNoeud(pN->fg);
      afficherElem(pN->info);  
      printf("\n");
      affichageNoeuds(pN->fd);
    }

*/

void insererElement(Elem e, Arbre *pA){
	insererElementDansSSArbre(e, &(pA->adRacine), pA);
}

/* inserer des elements dans un arbre binaire*/
void insererElementDansSSArbre(Elem e, Noeud ** ppN, Arbre *pA){
	if( *ppN == NULL){
		*ppN=(Noeud*)malloc(sizeof(Noeud));
		initialiserNoeud(*ppN, e);
		pA->nbElemDansArbre=pA->nbElemDansArbre+1;
	}
	else{
		if (!estEgal(e,(*ppN)->info)){
			if (estInferieur(e,(*ppN)->info))
			{
				insererElementDansSSArbre(e,&((*ppN)->fg),pA);
			}
			if (estSuperieurOuEgal(e,(*ppN)->info))
			{
				insererElementDansSSArbre(e,&((*ppN)->fd),pA);
			}
		}
	}	 
}

void creerArbreDoubleChaine(Arbre *A){
	Noeud *test;
	if(A->adRacine==NULL){
		(A->adRacine)->pere=NULL;	
	}
	else{
		creerArbreDoubleChaine(A->adRacine=test->pere);
	}	
	
}


